home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_02_03
/
2n03053a
< prev
next >
Wrap
Text File
|
1991-01-14
|
2KB
|
74 lines
;********************************************************************
; _Check8087 -- check for a numeric coprocessor.
;
; C Prototype :
;
; short int Check8087(void)
;
; Input : Nothing
;
; Output: AX = 0 -- No Coprocessor
; 1 -- 8087
; 2 -- 80287
; 3 -- 80387
;
; Author : Bob Zigon
; Date : July 23, 1989
;********************************************************************
dosseg
.model small
.code
public _Check8087
_Check8087 proc near
local Control:word=ChLocals
push bp
mov bp,sp
sub sp,ChLocals ; Allocate some locals
finit ; Initialize math coprocessor
mov byte ptr Control+1,0 ; Clear memory byte
fnstcw Control ; Store control word in memory
mov ah,byte ptr Control+1 ; Upper byte is 03h if
cmp ah,03h ; ... coprocessor is present
jne No8087 ; No math coprocessor
;
; Check for 8087
;
and Control, NOT 0080h ; Turn interrupts on (IEM=0)
fldcw Control ; Load control word
fdisi ; Disable interrupts (IEM=1)
fstcw Control ; Store control word
test Control, 0080h ; If IEM=1, then 8087
jnz Is8087 ; We have an 8087
;
; Check if 80287 OR 80387
;
finit ; Use default infinity mode
fld1 ; Generate infinity
fldz ; by dividing 1 by zero
fdiv ;
fld st ; Form negative infinity
fchs ;
fcompp ; Compare +/- infinity
fstsw Control ; Equal for 87/287
fwait ; Wait for fstsw to complete
mov ax,Control ; Get NDP control word
sahf ; Store condition bits in flags
jz Is80287 ; It's 287 if infinities equal
mov ax,3 ; It must be an 80387
ChExit: mov sp,bp
pop bp
ret
No8087: xor ax,ax
jmp short ChExit
Is8087: mov ax,1
jmp short ChExit
Is80287: mov ax,2
jmp short ChExit
_Check8087 endp
end